//
//  FSBleConstants.h
//  FSBleTooth
//
//  Created by zt on 2020/4/3.
//  Copyright © 2020 XB. All rights reserved.
//

#ifndef FSBleConstants_h
#define FSBleConstants_h

#if (DEBUG == 1)
#define PLog(string, ...) NSLog(@"🔨 %@ <%d>🔥🔥 %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(string), ##__VA_ARGS__])
#else
#define PLog(string, ...)
#endif


#define kIsEmptyStr(str)  ([str isKindOfClass:[NSNull class]] || str == nil || [str length] < 1 || [str isEqualToString:@"<null>"] || [str isEqualToString:@"(null)"] ? YES : NO )

#define SF(format, ...) ([NSString stringWithFormat:(format), ##__VA_ARGS__])

#define weakObj(value) __weak typeof(value) weak##value = value;
#define SPBLOCK_EXEC(block, ...) if (block) { block(__VA_ARGS__); }
#define UUID(x)        [CBUUID UUIDWithString:(x)]

typedef NS_ENUM(int, BleManagerState) {
    BleManagerStatePoweredOff       ,        //蓝牙电源已关闭
    BleManagerStatePoweredOn        ,        //正常可用状态
    BleManagerStateUnsupported      ,        //设备不支持蓝牙功能
};

typedef NS_ENUM(NSInteger, FSConnectState) {
    FSConnectStateUnknown = 0,//未知
    FSConnectStateStart,//开始连接
    FSConnectStateCancel,//用户主动取消连接，在发起连接时
    FSConnectStateConnected,//刚连接上
    FSConnectStateDisconnected,//断开连接，意外断开或主动断开
    FSConnectStateReady,//连接好并准备就续
    FSConnectStateReadyTimeout,//连接上后，发送指令未得到回复，无法进入READY状态
    FSConnectStateError//连接错误
};

typedef NS_ENUM(NSInteger, FSDevice_TYPE) {
    FSDeviceTypeTreadmill      = 0,   // 跑步机
    FSDeviceTypeEllipse        = 1,   // 椭圆机
    FSDeviceTypeFitnessCar     = 2,   // 健身车
    FSDeviceTypeRowing         = 3,   // 划船器
    FSDeviceTypeRider          = 4,   // 骑马器
    FSDeviceTypeWalking        = 5,   // 走步机
    FSDeviceTypeUnknow                // 未知类型
};

typedef NS_ENUM(NSInteger, FS_Protocol_Version) {
    FS_Protocol_Version_105    = 105, // 1.0.5  蓝牙协议
    FS_Protocol_Version_110    = 110, // 1.1    蓝牙协议
};

// 蓝牙命令 开始 && 结束
typedef NS_ENUM(NSInteger, BLE_CMD) {
    BLE_CMD_START   = 0x02,        // 读取当前运动量
    BLE_CMD_END     = 0x03,        // 当前运动信息
};

// ==================================================================
   // 说明跑步机协议
// ==================================================================

typedef NS_ENUM(NSInteger, TREADMILL) {
    TreadmillInfo     = 0x50,              // 设备信息
    TreadmillStatus   = 0x51,              // 设备状态
    TreadmillData     = 0x52,              // 设备数据
    TreadmillControl  = 0x53,              // 设备控制
};

// 设备信息 0x50
typedef NS_ENUM(NSInteger, TREADMILL_INFO) {
    TreadmillInfoModel  = 0,        // 获取设备机型 (必需实现)
    TeadmillInfoSpeed   = 2,        // 获取设备速度参数 (必需实现)
    TeadmillInfoIncline = 3,        // 获取设备坡度参数
    TeadmillInfoTotal   = 4,        // 获取设备累计里程
    TeadmillInfoDate    = 1,        // 同步设备日期，返回版本日期1.0.5
};

// 设备状态  0x51
typedef NS_ENUM(NSInteger, TREADMILL_STATUS) {
    TreadmillStausNormal   = 0,    // 待机状态
    TreadmillStausEnd      = 1,    // 已停机状态(还未返回到待机)
    TreadmillStausStart    = 2,    // 倒计时启动状态
    TreadmillStausRunning  = 3,    // 运行中状态
    TreadmillStausStopping = 4,    // 减速停止中(完全停止后变为 PAUSED 或 END 或 NORMAL)
    TreadmillStausError    = 5,    // 设备故障状态
    TreadmillStausDisable  = 6,    // 禁用（安全开关或睡眠等）（1.1 修改）
    TreadmillStausReady    = 9,    // 设备就绪（1.1）CONTROL_READY 指令后应为此状态
    TreadmillStausPaused   = 10,   // 设备已暂停（1.1）
};

// 设备数据  0x52
typedef NS_ENUM(NSInteger, TREADMILL_DATA) {
    TreadmillDataSport   = 0,      // 读取当前运动量
    TreadmillDataInfo    = 1,      // 当前运动信息
    TreadmillDataSpeed   = 2,      // 速度数据(程式模式)
    TreadmillDataIncline = 3,      // 坡度数据(程式模式)
};

// 设备控制   0x53
typedef NS_ENUM(NSInteger, TREADMILL_CONTROL) {
    TreadmillControlUser   = 0,   // 写入用户信息
    TreadmillControlReady  = 1,   // 准备开始（1.1）（START 前写入运动数据）
    TreadmillControlTarget = 2,   // 控制速度、坡度（用户手动操作）
    TreadmillControlStop   = 3,   // 停止设备（此指令直接停止设备）
    TreadmillControlSpeed  = 4,   // 速度数据(程式模式)
    TreadmillControlHeight = 5,   // 坡度数据(程式模式)
    TreadmillControlStart  = 9,   // 开始或恢复设备运行（1.1 正式启动）
    TreadmillControlPause  = 10   // 暂停设备（1.1）
};

// 启动模式 SYS_MODE
typedef NS_ENUM(NSInteger, TREADMILL_START_MODE) {
    TreadmillStartModeNormal    = 0,   // 正常模式，用于快速启动
    TreadmillStartModeTimer     = 1,   // 倒计时间模式
    TreadmillStartModeDistance  = 2,   // 倒计距离模式
    TreadmillStartModeCalorises = 3,   // 倒计卡路里模式
    readmillStartModePogram     = 5,   // 程式模式(会发送速度及坡度数据)
};

// ==================================================================
   // 说明车表协议
// ==================================================================
typedef NS_ENUM(NSInteger, CARTABLE) {
    CarTableModel   = 0x50,   // 配置设备型号：0x02 0x50 0x00 0x50 0x03  可以获取设备品牌、机型
    CarTableParam   = 0x41,   // 设备参数
    CarTableStatus  = 0x42,   // 设备状态
    CarTableData    = 0x43,   // 设备数据
    CarTableControl = 0x44,   // 设备控制
};

// 车表设备参数信息
typedef NS_ENUM(NSInteger, CARTABLE_PARAM) {
    CarTableParamInfo    = 0x02,   // 获取0x02 0x41 0x02 0x40 0x03：  阻力B  坡度B  配置B  段数B
    CarTableParamTotal   = 0x03,   // 获取0x02 0x41 0x03 0x42 0x03：  累计值
    CarTableParamDate    = 0x04,   // 同步时间：传入数据  年月日周时分秒 年传入后2位
};

// 车表设备参数信息
typedef NS_ENUM(NSInteger, CARTABLE_STATUS) { // normal  0x02 0x42 0x42 0x03
    CarTableParamStatusNormal     = 0,    // 待机
    CarTableParamStatusStarting   = 1,    // 启动中
    CarTableParamStatusRunning    = 2,    // 运行   数据：速度W 阻力B 频率W 心率B 瓦特W 坡度B 段索引B
    CarTableParamStatusPause      = 3,    // 暂停   数据：速度W 阻力B 频率W 心率B 瓦特W 坡度B 段索引B
    CarTableParamStatusSleep      = 20,   // 睡眠
    CarTableParamStatusError      = 21    // 故障
};
/**
 a: 速度是以0.01位单位的16位整数，如：1000 则为10.00km/h
 b: 频率对应踏频、步频，名称与实际设备对应
 c: 瓦特单位为0.1瓦，如1000代表100.0瓦
 d：段索引仅在程式模式时使用，从1开始到程式长度
 e：设备不需要启动倒计时，状态直接从待机变化到运行
 */

// 车表数据
typedef NS_ENUM(NSInteger, CARTABLE_DATA) {
    CarTableDataSportData      = 0x01,   // 获取0x02 0x43 0x01 0x43 0x03 ：  时间W 距离W 热量W 计数W
    CarTableDataSportInfo      = 0x02,   // 获取0x02 0x43 0x02 0x41 0x03：  用户L 运动L 模式B 段数B 目标W
    CarTableDataProgramData    = 0x03,   // 获取：  索引B 数据N  这个可能不会用到
};
/**
 a 运动量不受倒计模式影响，数据总是从0开始向上计
 b 时间是运动所用时长，以秒为单位
 c 距离在小于32000时，单位为1， 否则最高位置1同时单位为10  这个与疑问，要仔细看
 d 计数为本次运动开始后感应器感应次数
 */

// 车表控制
typedef NS_ENUM(NSInteger, CARTABLE_CONTROL) {
    /*app在即将开始运行设备时，最先发送此指令给设备，通知设备即将开始，设备接收到此指令后，进行运动数据重置，同事恢复相关设置值   备注：倒计值 若设备需要倒计时提示用户，返回数据为倒计秒值，若不需要返回0*/
    CarTableControlReady             = 0x01,   // 0x02 0x44 0x01 0x45 0x03 准备就绪
    CarTableControlStart             = 0x02,   // 0x02 0x44 0x02 0x46 0x03 开始继续
    CarTableControlPause             = 0x03,   // 0x02 0x44 0x03 0x47 0x03 暂停
    CarTableControlStop              = 0x04,   // 0x02 0x44 0x04 0x40 0x03 停止
    CarTableControlParam             = 0x05,   // 设置参数  设置阻力  坡度
    CarTableControlStep              = 0x06,   // 设置步进  设置阻力  坡度
    CarTableControlUser              = 0x0A,   // 写入用户数据 ID（L） 体重B  身高B 年龄B 性别B（0:男  1:女）
    CarTableControlSportMode         = 0x0B,   // 运动模式  运动ID（L） 模式B   段数B  目标W
    CarTableControlFunctionSwitch    = 0x0C,   // 功能关开
    CarTableControlProgram           = 0x0D,   // 设置程式模式
};
/**
 a 运动ID为APP识别用，保存以备读取运动信息是用
 b 模式:低4位用于倒计量选择，高4位选择控制模式
 c 段数：模式包括控制模式时程式数据总段数，其他的为0
 d 目标是倒计模式或程式的目标总值，其他模式为0
 e 目标若为距离值，其他遵守最高位1标准，见获取运动数据指令
 */


// 车表数据  有控制模式时候，必须有倒计模式
typedef NS_ENUM(NSInteger, CARTABLE_START_MODE) {
    CarTableStartModeFree          = 0x00,  // 自由
    CarTableStartModeTime          = 0x01,  // 时间
    CarTableStartModeDistance      = 0x02,  // 距离
    CarTableStartModeCalory        = 0x03,  // 卡路里
    CarTableStartModeCount         = 0x04,  // 计数
    CarTableStartModeResistance    = 0x10,  // 阻力控制模式
    CarTableStartModeHeartRate     = 0x20,  // 心率控制模式
    CarTableStartModeWatt          = 0x03,  // 功率控制模式
};

// ==================================================================
   // 自定义配置信息
// ==================================================================
/// 最多连接3次
static int const maxConnectCnts             = 3;
/// 每次连接2秒
static int const connectTimes               = 2;
/// 默认扫描时间
static NSInteger const SCAN_TIMEINTERVAL    = 10;
/// 发送蓝牙指令的时间间隔
static float const BLE_SENDDATA_INTEVEL     = 0.5;
/// 回调 字符串 @"true" 给JS
static NSString *const JS_BACK_TRUE         = @"true";
/// 回调 字符串 @"flase" 给JS
static NSString *const JS_BACK_FLASE        = @"flase";
/// 连接超时
static NSString *const JS_BACK_TimeOut      = @"timeOut";
/// 只有这个开头的的蓝牙设备才是需要的设备
static NSString *const DEVICE_NAME_FREFIX   = @"FS-";
/// 是否为运动秀的设备
static NSString *const IS_FITSHOW_DEVICE    = @"isFitshowDevice";
/// 广播包数据长度
static NSInteger const DEVICE_ADVERDATA_LENGTH = 12;
/// 外设广播包数据
static NSString *const peripheral_advData   = @"advertisementData";
/// 外设的mac地址
static NSString *const peripheral_mac       = @"mac";
/// 外设的名字
static NSString *const peripheral_name      = @"name";
/// 外设的信号
static NSString *const peripheral_rssi      = @"rssi";
/// 是否在搜索中
static NSString *const searching            = @"searching";
/// 扫描到的外设
static NSString *const peripheral_scaned    = @"peripheral_scaned";
/// 设备型号 设备id
static NSString *const deviceID             = @"device";
/// 设备类型
static NSString *const deviceType           = @"type";
/// 设备系列号
static NSString *const serialNum            = @"serial";
/// 需要的服务
static NSString *const SERVICES_UUID        = @"FFF0";
/// 可以订阅的特征
static NSString *const CHAR_NOTIFY_UUID     = @"FFF1";
/// 可以写入的特征
static NSString *const CHAR_WRITE_UUID      = @"FFF2";
/**
连接后可读特征：
2A29:厂家 2A24:型号 2A27:硬件版本 2A28:软件版本 2ACC:
2ACD:    2AD3:    2ADA:        2AD9:        2AD4:
*/
/// 厂家
static NSString *const CHAR_READ_MFRS       = @"2A29";
/// 型号
static NSString *const CHAR_READ_PN         = @"2A24";
/// 硬件版本
static NSString *const CHAR_READ_HV         = @"2A27";
/// 软件版本
static NSString *const CHAR_READ_SV         = @"2A28";
// 下面几个可读特征，暂时不知道是什么特征，还没使用到
static NSString *const CHAR_READ_2ACC       = @"2ACC";
static NSString *const CHAR_READ_2ACD       = @"2ACD";
static NSString *const CHAR_READ_2AD3       = @"2AD3";
static NSString *const CHAR_READ_2ADA       = @"2ADA";
static NSString *const CHAR_READ_2AD9       = @"2AD9";
static NSString *const CHAR_READ_2AD4       = @"2AD4";
/// 设备意外断开
static NSString *const accident             = @"accident";
/// 信息类型
static NSString *const infoType             = @"infoType";
/// 厂家 连接后方可获取
static NSString *const manufacturer         = @"manufacturer";
/// 机型 连接后方可获取
static NSString *const model                = @"model";
/// 硬件版本 连接后方可获取
static NSString *const hardware             = @"hardware";
/// 软件版本 连接后方可获取
static NSString *const software             = @"software";
/// 最快速度
static NSString *const maxSpeed             = @"maxSpeed";
/// 最慢速度
static NSString *const minSpeed             = @"minSpeed";
/// 最高坡度
static NSString *const maxSlope             = @"maxSlope";
/// 最低坡度
static NSString *const minSlope             = @"minSlope";
/// 单位
static NSString *const unite                = @"unite";
/// 设备总里程
static NSString *const totalDistance        = @"totalDistance";
/// 当前状态      // 意外断开  这个状态传999
static NSString *const currentStatus        = @"currentStatus";
/// 旧的状态
static NSString *const oldStatus            = @"oldStatus";
/// 启动倒计时
static NSString *const countDown            = @"countDown";
/// 当前速度        跑步机、车表共用
static NSString *const currentSpeed         = @"currentSpeed";
/// 当前坡度        跑步机、车表共用
static NSString *const currentSlope         = @"currentSlope";
/// 运动时长        跑步机、车表共用
static NSString *const runtimes             = @"time";
/// 运动距离        跑步机、车表共用
static NSString *const runDistance          = @"distance";
/// 当前消耗的卡路里  跑步机、车表共用
static NSString *const runCalory            = @"calory";
/// 步数            跑步机、车表共用
static NSString *const runStepCount         = @"stepCount";
/// 错误码
static NSString *const errorCode            = @"errorCode";
/// 用户id
static NSString *const u_id                 = @"uid";
/// 体重
static NSString *const u_weight             = @"weight";
/// 身高
static NSString *const u_height            = @"height";
/// 调整速度
static NSString *const adjustSpeed         = @"adjustSpeed";
/// 调整坡度
static NSString *const adjustSlope         = @"adjustSlope";
/// 设备连接状态
static NSString *const deviceState         = @"deviceContentState";


// =========================
  //车表协议增加的
// =========================

/// 设备阻力
static NSString *const maxResistance      = @"maxResistance";
/// 设备配置
static NSString *const config             = @"config";
/// 设备段数
static NSString *const paragraph          = @"paragraph";
/// 当前频率
static NSString *const currentFrequency   = @"currentFrequency";
/// 当前心率
static NSString *const currentHeartRate   = @"currentHeartRate";
/// 当前瓦特
static NSString *const currentWatt        = @"currentWatt";
/// 当前段数
static NSString *const currentParagraph   = @"currentParagraph";
/// 当前阻力
static NSString *const currentResistance  = @"currentResistance";
// 测试：FS-74907B
// 黑色：FS-729949  
// 跑客: FS-EA54CE
//static NSString *const testDevice     = @"FS-74907B";

// ==================================================================
   // 第三方配置
// ==================================================================

static NSString * const kGoogleClientID =
@"com.googleusercontent.apps.970598696117-c4u7ck2ha95si06vubdf8in20e16ipa1";



#endif /* FSBleConstants_h */
